package controllers

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/inntu/backend/api/models"
	"github.com/inntu/backend/api/services"
	"github.com/inntu/backend/utils"
)

// CategoryController 分类控制器（重构后统一命名）
type CategoryController struct {
	service *services.CategoryService
}

// NewCategoryController 创建分类控制器
func NewCategoryController() *CategoryController {
	return &CategoryController{
		service: services.NewCategoryService(),
	}
}

// 已移除向后兼容的别名和构造函数

// GetCategories 获取分类列表
// @Summary 获取分类列表
// @Description 获取分类列表，支持按页面、父分类、状态筛选
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param page_code query string false "页面代码"
// @Param parent_id query int false "父分类ID"
// @Param status query int false "状态"
// @Security Bearer
// @Success 200 {object} utils.Response{data=[]models.Category}
// @Router /api/v1/categories [get]
func (c *CategoryController) GetCategories(ctx *gin.Context) {
	pageCode := ctx.Query("page_code")
	parentIDStr := ctx.Query("parent_id")
	statusStr := ctx.Query("status")

	var parentID *int
	if parentIDStr != "" {
		if id, err := strconv.Atoi(parentIDStr); err == nil {
			parentID = &id
		}
	}

	var status *int
	if statusStr != "" {
		if s, err := strconv.Atoi(statusStr); err == nil {
			status = &s
		}
	}

	var categories []models.Category
	var err error

	// 如果指定了页面代码，使用页面查询
	if pageCode != "" {
		categories, err = c.service.GetCategoriesByPage(pageCode, status)
	} else {
		categories, err = c.service.GetCategories(parentID, status)
	}

	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "获取分类列表失败: "+err.Error())
		return
	}

	utils.SuccessResponse(ctx, "获取分类列表成功", categories)
}

// 已移除向后兼容的方法 GetGormCategories

// GetCategory 获取分类详情
// @Summary 获取分类详情
// @Description 获取分类详情
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param id path int true "分类ID"
// @Security Bearer
// @Success 200 {object} utils.Response{data=models.Category}
// @Router /api/v1/categories/{id} [get]
func (c *CategoryController) GetCategory(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	category, err := c.service.GetCategory(id)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusNotFound, "分类不存在")
		return
	}

	utils.SuccessResponse(ctx, "获取分类详情成功", category)
}

// 已移除向后兼容的方法 GetGormCategory

// GetCategoryWithItems 获取分类及其项目
// @Summary 获取分类及其项目
// @Description 获取分类详情及其关联的项目列表
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param id path int true "分类ID"
// @Success 200 {object} utils.Response{data=models.Category}
// @Router /api/v1/categories/{id}/items [get]
func (c *CategoryController) GetCategoryWithItems(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	category, err := c.service.GetCategoryWithItems(id)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusNotFound, "分类不存在")
		return
	}

	utils.SuccessResponse(ctx, "获取分类及项目成功", category)
}

// CreateCategory 创建分类（管理端）
// @Summary 创建分类
// @Description 创建新的分类，支持同时建立页面和项目关联关系
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param category body models.CreateCategoryRequest true "分类信息"
// @Success 200 {object} utils.Response{data=models.Category}
// @Router /api/v1/categories [post]
func (c *CategoryController) CreateCategory(ctx *gin.Context) {
	var req models.CreateCategoryRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "请求参数错误: "+err.Error())
		return
	}

	// 如果没有关联关系，使用原有的简单创建方法
	if len(req.PageIDs) == 0 && len(req.ItemIDs) == 0 {
		category := req.ToCategory()
		if err := c.service.CreateCategory(category); err != nil {
			utils.ErrorResponse(ctx, http.StatusInternalServerError, "创建分类失败: "+err.Error())
			return
		}
		utils.SuccessResponse(ctx, "创建分类成功", category)
		return
	}

	// 使用事务创建分类并建立关联关系
	category, err := c.service.CreateCategoryWithRelations(&req)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "创建分类失败: "+err.Error())
		return
	}

	utils.SuccessResponse(ctx, "创建分类成功", category)
}

// UpdateCategory 更新分类（管理端）
// @Summary 更新分类
// @Description 更新分类信息
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param id path int true "分类ID"
// @Param category body models.Category true "分类信息"
// @Success 200 {object} utils.Response{data=models.Category}
// @Router /api/v1/categories/{id} [put]
func (c *CategoryController) UpdateCategory(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	var category models.Category
	if err := ctx.ShouldBindJSON(&category); err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "请求参数错误: "+err.Error())
		return
	}

	category.ID = id
	if err := c.service.UpdateCategory(&category); err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "更新分类失败: "+err.Error())
		return
	}

	utils.SuccessResponse(ctx, "更新分类成功", category)
}

// DeleteCategory 删除分类（管理端）
// @Summary 删除分类
// @Description 逻辑删除分类
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param id path int true "分类ID"
// @Success 200 {object} utils.Response
// @Router /api/v1/categories/{id} [delete]
func (c *CategoryController) DeleteCategory(ctx *gin.Context) {
	idStr := ctx.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	if err := c.service.DeleteCategory(id); err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, "删除分类失败: "+err.Error())
		return
	}

	utils.SuccessResponse(ctx, "删除分类成功", map[string]interface{}{"deleted": true})
}

// AddItemToCategory 添加项目到分类
// @Summary 添加项目到分类
// @Description 建立分类和项目的关联关系
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param categoryId path int true "分类ID"
// @Param itemId path int true "项目ID"
// @Success 200 {object} utils.Response "成功"
// @Failure 400 {object} utils.Response "请求参数错误"
// @Failure 500 {object} utils.Response "服务器错误"
// @Router /api/v1/categories/{categoryId}/items/{itemId} [post]
func (c *CategoryController) AddItemToCategory(ctx *gin.Context) {
	categoryIDStr := ctx.Param("categoryId")
	itemIDStr := ctx.Param("itemId")

	categoryID, err := strconv.Atoi(categoryIDStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	itemID, err := strconv.Atoi(itemIDStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的项目ID")
		return
	}

	if err := c.service.AddItemToCategory(categoryID, itemID); err != nil {
		// 根据错误类型返回不同的HTTP状态码
		errorMsg := err.Error()
		if errorMsg == "分类不存在" || errorMsg == "项目不存在" {
			utils.ErrorResponse(ctx, http.StatusNotFound, errorMsg)
		} else if errorMsg == "该项目已经关联到此分类" {
			utils.ErrorResponse(ctx, http.StatusConflict, errorMsg)
		} else {
			utils.ErrorResponse(ctx, http.StatusInternalServerError, errorMsg)
		}
		return
	}

	utils.SuccessResponse(ctx, "添加项目到分类成功", nil)
}

// RemoveItemFromCategory 从分类移除项目
// @Summary 从分类移除项目
// @Description 移除分类和项目的关联关系
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param categoryId path int true "分类ID"
// @Param itemId path int true "项目ID"
// @Success 200 {object} utils.Response "成功"
// @Failure 400 {object} utils.Response "请求参数错误"
// @Failure 500 {object} utils.Response "服务器错误"
// @Router /api/v1/categories/{categoryId}/items/{itemId} [delete]
func (c *CategoryController) RemoveItemFromCategory(ctx *gin.Context) {
	categoryIDStr := ctx.Param("categoryId")
	itemIDStr := ctx.Param("itemId")

	categoryID, err := strconv.Atoi(categoryIDStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的分类ID")
		return
	}

	itemID, err := strconv.Atoi(itemIDStr)
	if err != nil {
		utils.ErrorResponse(ctx, http.StatusBadRequest, "无效的项目ID")
		return
	}

	if err := c.service.RemoveItemFromCategory(categoryID, itemID); err != nil {
		utils.ErrorResponse(ctx, http.StatusInternalServerError, err.Error())
		return
	}

	utils.SuccessResponse(ctx, "从分类移除项目成功", nil)
}
